home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 25 / Cream of the Crop 25.iso / faq / wdj0597.zip / NELSON.ZIP / MAY97.CPP
C/C++ Source or Header  |  1997-02-10  |  1KB  |  52 lines

  1. // This program demonstrates a virtual destructor
  2. // problem in Borland C+ 5.01.  When I create an
  3. // object of class base, I see the normal sequence
  4. // of constructors.  The base class ctor is called
  5. // first, followed by the derived class ctor. Likewise,
  6. // when I call the destructur, the derived class is
  7. // destroyed first, then the base class.  This is true
  8. // even if the pointer is a pointer to the base class,
  9. // because the destructor is a virtual destructor.
  10. //
  11. // Unfortunately, when I destroy an array of objects
  12. // of type derived, the derived class destructor doesn't
  13. // get called.  This seems bad, and in fact, Visual C++
  14. // and other C++ compilers seem to know they need to
  15. // call the virtual destructor, which in turn calls
  16. // the derived class dtor.
  17. //
  18.  
  19. #include <iostream.h>
  20.  
  21. class base
  22. {
  23. public:
  24.     base ()              { cout << "base() called...  "; }
  25.     virtual ~base ()     { cout << "~base() called\n"; }
  26. };
  27.  
  28. class derived : public base
  29. {
  30. public:
  31.     derived () : base ()     { cout << "derived() called\n"; }
  32.     virtual ~derived ()     { cout << "~derived() called...  "; }
  33. };
  34.  
  35. void main ()
  36. {
  37.     cout << "\nConstructing object...\n";
  38.     derived *c = new derived;
  39.     base *g = c;
  40.  
  41.     cout << "\nDestroying object...\n";
  42.     delete g;
  43.  
  44.     cout << "\nConstructing vector...\n";
  45.     derived *b = new derived[ 3 ];
  46.     base *f = b;
  47.  
  48.     cout << "\nDestroying vector...\n";
  49.     delete[] f;
  50.  
  51. }
  52.